package com.zkh.myutils.json;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.zkh.myutils.bean.BeanUtils;
import com.zkh.myutils.bean.TypeConverter;
import com.zkh.myutils.code.CoderUtils;
import com.zkh.myutils.utils.Regexp;
import com.zkh.myutils.utils.TypeUtils;

public final class JSONArray extends JSON{
	/**
	 * 内部存储Map
	 */
	private List<Object> jsonObjectList = new ArrayList<Object>();
	
	/**
	 * 私有构造器，内部调用
	 * @param jsonObjectMap
	 */
	private JSONArray(List<Object> jsonObjectList) {
		this.jsonObjectList = jsonObjectList;
	}
	
	/**
	 * JSON对象构造器
	 * @param obj 待转换的对象。可为json字符串（json字符串转对象）和非字符串对象（对象转json字符串）
	 * @return
	 */
	public JSONArray(Object obj) {
		this(obj, null);
	}
	
	/**
	 * JSON对象构造器
	 * @param obj 待转换的对象。可为json字符串（json字符串转对象）和非字符串对象（对象转json字符串）
	 * @param converter 转换器，自定义转换方法
	 * @return
	 */
	public JSONArray(Object obj, TypeConverter converter) {
		//解析器
		this.converter = converter==null ? new TypeConverter() : converter;
		//不为空
		if(obj!=null && !obj.toString().isEmpty()) {
			//字符串
			if(obj instanceof String) {
				if(Regexp.isMatch("\\s*\\[.*\\]\\s*", obj.toString())) {
					//解析字符串
					jsonObjectList = JSONStringParser.parseToList(TypeUtils.toWrap(CoderUtils.decodeUnicode(obj.toString()).toCharArray()));
				}else {
					throw new JSONParseException("字符串必须满足JSON格式");
				}
			}else if(obj instanceof Collection || obj.getClass().isArray()) {
				//解析数组或集合
				jsonObjectList = new JSONObjectParser(this.converter).parseToList(obj); 
			}else {
				throw new JSONParseException("非数组且非集合无法转换为JSONArray对象");
			}
		}
	}

	/**
	 * 获取JSONObject对象
	 * @return
	 */
	protected static JSONArray valueOf(List<Object> jsonObjectList) {
		return new JSONArray(jsonObjectList);
	}

	/**
	 * 是否为空
	 * @return
	 */
	public boolean isEmpty() {
		return jsonObjectList.isEmpty();
	}
	
	/**
	 * 添加一个元素
	 * @param value 要添加的元素
	 */
	public void add(Object value) {
		//检查转换器
		checkConverter();
		//添加
		jsonObjectList.add(new JSONObjectParser(this.converter).parseObject(value));
	}
	
	/**
	 * 在指定位置添加一个元素
	 * @param index 指定位置索引
	 * @param value 要添加的元素
	 */
	public void add(int index, Object value) {
		//检查转换器
		checkConverter();
		//添加
		jsonObjectList.add(index, new JSONObjectParser(this.converter).parseObject(value));
	}
	
	/**
	 * 移除元素
	 * @param index 元素索引位置
	 */
	public void remove(int index) {
		jsonObjectList.remove(index);
	}
	
	/**
	 * 获取boolean值
	 * @param index 索引
	 * @return
	 */
	public boolean getBooleanValue(int index) {
		return (boolean) jsonObjectList.get(index);
	}
	
	/**
	 * 获取数字类型
	 * @param index 索引
	 * @return
	 */
	public BigDecimal getNumberValue(int index) {
		return (BigDecimal) jsonObjectList.get(index);
	}
	
	/**
	 * 获取字符串类型
	 * @param index 索引
	 * @return
	 */
	public String getStringValue(int index) {
		return (String) jsonObjectList.get(index);
	}
	
	/**
	 * 获取实体
	 * @param index 索引
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public <T> T getEntity(int index, Class<T> beanClass) {
		return BeanUtils.mapToBean((Map<String, Object>) jsonObjectList.get(index), beanClass);
	}
	
	/**
	 * 获取日期类型（默认可解析yyyy-MM-dd和yyyy-MM-dd HH:mm:ss）
	 * @param index 索引
	 * @return 空时，返回null，不符合默认格式的，抛出异常
	 */
	public Date getDateValue(int index) {
		return getDefaultDate((String) jsonObjectList.get(index));
	}
	
	/**
	 * 获取日期类型
	 * @param index 索引
	 * @param format 日期字符串格式
	 * @return 空时，返回null，不符合指定格式的，抛出异常
	 */
	public Date getDateValue(int index, String format) {
		return getDate((String) jsonObjectList.get(index), format);
	}
	
	/**
	 * 获取JSONObject对象
	 * @param index 索引
	 */
	public JSONObject getJSONObject(int index) {
		@SuppressWarnings("unchecked")
		Map<String, Object> map = (Map<String, Object>) jsonObjectList.get(index);
		return JSONObject.valueOf(map);
	}
	
	/**
	 * 获取JSONArray对象
	 * @param index 索引
	 * @return
	 */
	public JSONArray getJSONArray(int index) {
		@SuppressWarnings("unchecked")
		List<Object> list = (List<Object>) jsonObjectList.get(index);
		return valueOf(list);
	}
	
	/**
	 * 获取JSON数组对象长度
	 * @return
	 */
	public int getSize() {
		return jsonObjectList.size();
	}
	
	/**
	 * JSON对象转集合
	 * @param type 集合元素类型
	 * @return
	 */
	public List<Object> parseList(){
		return jsonObjectList;
	}
	
	/**
	 * JSON对象转集合
	 * @param type 集合元素类型
	 * @return
	 */
	public <T> List<T> parseList(Class<T> type){
		return super.parseList(jsonObjectList, type);
	}
	
	/**
	 * 返回json格式的字符串
	 */
	public String toString() {
		return toString(jsonObjectList, false);
	}
	
	/**
	 * 返回json格式的字符串
	 * @param ignoreNullValueKey 是否忽略值为null的key
	 * @return
	 */
	public String toString(boolean ignoreNullValueKey) {
		return toString(jsonObjectList, ignoreNullValueKey);
	}
	
	/**
	 * 检查转换器
	 */
	private void checkConverter() {
		if(converter==null) {
			converter = new TypeConverter();
		}
	}
}
